package simulation;

import java.util.Random;

/**
 * 数学算法工具类（全局方法）
 */
public class MathUtil {
    private static final Random rand = new Random();

    /**
     * 计算两个学生之间的距离
     * @param A 一个学生
     * @param B 另一个学生
     * @return 两个学生间的距离
     */
    public static double distanceOfStudent(Student A,Student B){
        return Math.sqrt(Math.pow((A.getCenterX() - B.getCenterX()), 2)
                + Math.pow((A.getCenterY() - B.getCenterY()), 2));
    }

    /**
     * 伪伪高斯分布
     * @param sigma 最大偏移量
     * @param u 均值（期望值）
     * @return 高斯分布结果
     */
    public static double stdGaussian(double sigma, double u) {
        double X = rand.nextGaussian();
        X -= (int) X; // 防止越界
        return u + sigma * X;
    }

    /**
     * 获取随机数函数
     * @return [bound1, bound2]或[bound2, bound1]之间的一个整型数
     */
    public static int randomInt(int bound1, int bound2) {
        int lowerBound = Math.min(bound1, bound2);
        int upperBound = Math.max(bound1, bound2);
        return rand.nextInt(upperBound - lowerBound + 1) + lowerBound;
    }

    /**
     * 获取随机数函数
     * @return [bound1, bound2]或[bound2, bound1]之间的一个双精度浮点数
     */
    public static double randomDouble(double bound1, double bound2) {
        double lowerBound = Math.min(bound1, bound2);
        double upperBound = Math.max(bound1, bound2);
        return rand.nextDouble() * (upperBound - lowerBound) + lowerBound;
    }

    /**
     * 返回速度函数
     * @param posA 点A
     * @param posB 点B
     * @param count 在多少个时钟周期内要从点A到点B
     * @return 每个时钟周期要移动的距离
     */
    public static double getSpeed(double posA, double posB, int count) {
            return ( posB - posA )/ count;
    }
}
